package servlets;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import util.MonTimerTask;
import util.TimerAttenteJoueur;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.usecases.GestionPartie;

@SuppressWarnings("serial")
@WebServlet(name = "servlet_attente_partie.html")
public class AttentePartie extends HttpServlet {

	@EJB GestionPartie gestionPartie;

	private static Map<Integer, TimerAttenteJoueur> timers = new HashMap<Integer, TimerAttenteJoueur>();

	// Renvoie un HTTP status 290 pour indiquer de rediriger vers Partie, 291 pour dashboard
	protected void doGet(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
		// Récupérer et tester les paramètres
		Joueur joueur = (Joueur) request.getSession().getAttribute("joueur");
		if (joueur == null) {
			RequestDispatcher rd = getServletContext().getNamedDispatcher("index.html");
			rd.forward(request, response);
			return;
		}
		if (request.getSession().getAttribute("partie") == null) {
			RequestDispatcher rd = getServletContext().getNamedDispatcher("servlet_dashboard.html");
			rd.forward(request, response);
			return;
		}
		int idPartie = (int) request.getSession().getAttribute("partie");
		
		// Récupère des données du modèle
		Partie partie = gestionPartie.getPartie(idPartie);
		
		if (partie != null) {
			List<String> joueurs = new LinkedList<String>();
			for (Joueur j : partie.getJoueurs()) {
				joueurs.add(j.getLogin());
			}
			request.setAttribute("joueurs", joueurs);
			
			if (!timers.containsKey(idPartie)) {
				TimerAttenteJoueur timer = new TimerAttenteJoueur(idPartie);
				final MonTimerTask timerTask = new MonTimerTask(idPartie) {
					@Override
					public void run() {
						int nbJoueurs = gestionPartie.getJoueursDunePartie(this.getIdPartie()).size();
						if (nbJoueurs >= Partie.MIN_JOUEURS) {
							gestionPartie.commencerPartie(this.getIdPartie());
							response.setStatus(290);
						} else {
							gestionPartie.annulerPartie(this.getIdPartie());
							response.setStatus(291);
						}
						timers.remove(this.getIdPartie());
					}
				};
				timer.schedule(timerTask, Partie.TEMPS_DEBUT_PARTIE * 1000);
				timers.put(idPartie, timer);
			}
			
			request.setAttribute("timer", Partie.TEMPS_DEBUT_PARTIE - timers.get(partie.getIdPartie()).tempsEcoule());

			if (partie.getJoueurs().size() == Partie.MAX_JOUEURS){
				timers.get(partie.getIdPartie()).cancel();
				gestionPartie.commencerPartie(partie.getIdPartie());
				response.setStatus(290);
			}
			
			// Rediriger
			request.setAttribute("servletDestination", "servlet_partie.html");
			RequestDispatcher rd = getServletContext().getNamedDispatcher("attentePartie.html");
			rd.forward(request, response);
			return;
		}
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}